package JUC.多线程;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * @author CKC
 * @DateTime 2021/6/12 10:34
 */
public class NewScheduledThreadPoolDemo {
    public static void main(String[] args) {
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
        
//        method1(pool);
//        method2(pool);
        method3(pool);
    }
    public static void method3(ScheduledExecutorService pool){
        long start = System.currentTimeMillis();
        //scheduleWithFixedDelay
        // 提交一个周期性动作，该动作在给定的初始延迟后首先启用，然后在一个执行终止和下一个执行开始之间具有给定的延迟。
        pool.scheduleWithFixedDelay(() -> {
            System.out.println(Thread.currentThread().getName() + "  " + (System.currentTimeMillis() - start) / 1000.0 + "ms");
            LockSupport.parkNanos(3L * 1000 * 1000_000);
            System.out.println("----------");
            //会影响时间间隔，任务本身执行时间长于任务执行的间隔时间（第二个参数1），
            //时间间隔设置一秒，任务执行时间  不在内，任务执行结束后在 等待 执行
        }, 0, 1, TimeUnit.SECONDS);
    }
    
    
    public static void method2(ScheduledExecutorService pool){
        //固定速率执行反复一个任务
        long start = System.currentTimeMillis();
        
        //scheduleAtFixedRate
        // 提交一个周期性动作，在给定的初始延迟后首先启用，然后在给定的时间段内启用；
        // 也就是说，执行将在initialDelay之后initialDelay ，然后是initialDelay + period ，
        // 然后是initialDelay + 2 * period ，依此类推。
        pool.scheduleAtFixedRate(() -> {
            System.out.println(Thread.currentThread().getName() + "  " + (System.currentTimeMillis() - start) / 1000.0 + "ms");
            try {
                LockSupport.parkNanos(3L * 1000 * 1000000);
                System.out.println("-------------");
                //会影响时间间隔，任务本身执行时间长于任务执行的间隔时间（第二个参数1），
                //时间间隔设置一秒，任务执行时间也在内
            } finally {
                System.out.println("sdsddddd");
            }
        }, 0, 1, TimeUnit.SECONDS);
    }
    
    private static void method1(ScheduledExecutorService pool) {
        /*延迟执行任务*/
        pool.schedule(() -> {
            System.out.println("task   1");
            int i = 10 / 0;     /*不会抛出异常，   可以自己捕捉异常*/
            System.out.println("asdasd");       //不会执行
        }, 1, TimeUnit.SECONDS);
        
        
        pool.schedule(() -> {
            System.out.println("task   2");
        }, 1, TimeUnit.SECONDS);
    }
}
